Fix checksum-offload problems introduced in c/s 9514, due to
authorkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>
Wed, 5 Apr 2006 09:37:37 +0000 (10:37 +0100)
committerkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>
Wed, 5 Apr 2006 09:37:37 +0000 (10:37 +0100)
data_validated flag not being properly specified on the
device channel.

Signed-off-by: Keir Fraser <keir@xensource.com>
linux-2.6-xen-sparse/drivers/xen/netback/netback.c
linux-2.6-xen-sparse/drivers/xen/netfront/netfront.c

index d9f259ce26f02d8e7d22b938aa42b39bf907c352..8e3a1c72b7933b652c8a85e21f247ded08769147 100644 (file)
@@ -329,9 +329,9 @@ static void net_rx_action(unsigned long unused)
                irq = netif->irq;
                id = RING_GET_REQUEST(&netif->rx, netif->rx.rsp_prod_pvt)->id;
                flags = 0;
-               if (skb->ip_summed == CHECKSUM_HW)
-                       flags |= NETRXF_csum_blank;
-               if (skb->proto_data_valid)
+               if (skb->ip_summed == CHECKSUM_HW) /* local packet? */
+                       flags |= NETRXF_csum_blank | NETRXF_data_validated;
+               else if (skb->proto_data_valid) /* remote but checksummed? */
                        flags |= NETRXF_data_validated;
                if (make_rx_response(netif, id, status,
                                     (unsigned long)skb->data & ~PAGE_MASK,
@@ -658,7 +658,11 @@ static void net_tx_action(unsigned long unused)
                skb->dev      = netif->dev;
                skb->protocol = eth_type_trans(skb, skb->dev);
 
-               if (txreq.flags & NETTXF_data_validated) {
+               /*
+                * Old frontends do not assert data_validated but we
+                * can infer it from csum_blank so test both flags.
+                */
+               if (txreq.flags & (NETTXF_data_validated|NETTXF_csum_blank)) {
                        skb->ip_summed = CHECKSUM_UNNECESSARY;
                        skb->proto_data_valid = 1;
                } else {
index 1f2ee99e5818c63777eaa39a5cd170ab54df7718..b85ff4b1d3c8da47c96a2d65fea698a7c3f52a1a 100644 (file)
@@ -698,9 +698,9 @@ static int network_start_xmit(struct sk_buff *skb, struct net_device *dev)
        tx->size = skb->len;
 
        tx->flags = 0;
-       if (skb->ip_summed == CHECKSUM_HW)
-               tx->flags |= NETTXF_csum_blank;
-       if (skb->proto_data_valid)
+       if (skb->ip_summed == CHECKSUM_HW) /* local packet? */
+               tx->flags |= NETTXF_csum_blank | NETTXF_data_validated;
+       if (skb->proto_data_valid) /* remote but checksummed? */
                tx->flags |= NETTXF_data_validated;
 
        np->tx.req_prod_pvt = i + 1;
@@ -816,7 +816,11 @@ static int netif_poll(struct net_device *dev, int *pbudget)
                skb->len  = rx->status;
                skb->tail = skb->data + skb->len;
 
-               if (rx->flags & NETRXF_data_validated) {
+               /*
+                * Old backends do not assert data_validated but we
+                * can infer it from csum_blank so test both flags.
+                */
+               if (rx->flags & (NETRXF_data_validated|NETRXF_csum_blank)) {
                        skb->ip_summed = CHECKSUM_UNNECESSARY;
                        skb->proto_data_valid = 1;
                } else {
@@ -1017,8 +1021,11 @@ static void network_connect(struct net_device *dev)
                tx->gref = np->grant_tx_ref[i];
                tx->offset = (unsigned long)skb->data & ~PAGE_MASK;
                tx->size = skb->len;
-               tx->flags = (skb->ip_summed == CHECKSUM_HW) ?
-                       NETTXF_csum_blank : 0;
+               tx->flags = 0;
+               if (skb->ip_summed == CHECKSUM_HW) /* local packet? */
+                       tx->flags |= NETTXF_csum_blank | NETTXF_data_validated;
+               if (skb->proto_data_valid) /* remote but checksummed? */
+                       tx->flags |= NETTXF_data_validated;
 
                np->stats.tx_bytes += skb->len;
                np->stats.tx_packets++;